package com.woniuxy.amusementparkos.controller.lzw;

import com.woniuxy.amusementparkos.entity.lzw.ImprestInfo;
import com.woniuxy.amusementparkos.entity.lzw.Vaults;
import com.woniuxy.amusementparkos.service.lzw.ImprestInfoService;
import com.woniuxy.amusementparkos.service.lzw.VaultsService;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.math.BigDecimal;
import java.util.List;

/**
 * 备用金(ImprestInfo)表控制层
 *      作用：用于备用金前台的一系列控制操作
 *      主要包括2个方面：
 *         1.备用金信息的列表展示（selectAll）
 *         2.录入备用金信息（insertImprestInfo）
 *      执行逻辑：
 *         1.列表展示：对备用金表及相关表进行查询（select）操作，通过List返回json数据
 *         2.录入信息：对备用金表进行插入（insert）操作，期间判断抽大钞来源是否为金库表（Vaults），
 *                   如果是，原表金额将减去备用金金额，执行更新（update）操作。
 *      其他方法：备用
 *
 * @author lizhiwen
 * @since 2020-04-22 16:46:24
 */
@RestController
@RequestMapping("imprestInfo")
public class ImprestInfoController {
    /**
     * 服务对象:备用金信息Service
     */
    @Resource
    private ImprestInfoService imprestInfoService;

    /**
     * 财务金库
     */
    @Resource
    private VaultsService vaultsService;
    /**
     * 备用金信息 单条获取
     *    执行逻辑：通过页面传入备用金信息的id，获取全部备用金信息
     *
     * @param id 主键
     * @return 单条备用金数据
     */
    @GetMapping("selectOne")
    public ImprestInfo selectOne(Integer id) {
        return this.imprestInfoService.getById(id);
    }

    /**
     * 备用金信息 全部数据获取
     *     执行逻辑：从数据库获取全部备用金信息
     *     作用：将在前端页面的备用金列表上显示
     *
     * @return 备用金信息list集合
     */
    @GetMapping("selectAll")
    public List<ImprestInfo> selectAll(){
        return this.imprestInfoService.listAll();
    }

    /**
     * 备用金信息录入
     *      执行逻辑：向备用金信息表插入数据
     *      作用：前台完成备用金录入功能
     *
     * @param imprestInfo
     */
    @PostMapping("insert")
    public void insertImprestInfo(ImprestInfo imprestInfo){

        // 当备用金来自 金库 时：
        if(imprestInfo.getImprestSourceFore()==4){
            // 获取备用金金额
            BigDecimal imprestMoney = imprestInfo.getImprestMoney();
            // 查询金库总额
            Vaults countVault = this.vaultsService.getVault();
            // 计算：原金库 - 备用金金额 = 现金库金额
            BigDecimal subtract = countVault.getCash().subtract(imprestMoney);
            // 插入金库
            Vaults vault = new Vaults();
            vault.setCash(subtract);
            this.vaultsService.update(vault);
        }else{
            /*
             当备用金来自 其他柜台 时
                与 抽大钞同理，请移至ExtractMoneyInfoController查看
             */


        }

        // 插入备用金
        this.imprestInfoService.insert(imprestInfo);
    }


}